package com.speedchina.framework.base;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.speedchina.framework.helper.Assert;
import com.speedchina.framework.model.R;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 控制层基类, （日志类、基础属性等存放）
 * S 作为实际的服务接口
 * T 作为实际的实体
 * M 作为实际实体对应的PO 用于处理 表业务关系中的查询字段映射
 *
 * @author hank
 * @email han.q@sand.com.cn
 * @create 2018-10-19 上午11:01
 **/

public abstract class BaseController<S extends IService,T extends TEntity,M extends T> {

    protected static final String SPLIT_REGEX = ",";

    @Autowired S service;

    protected Logger logger = LoggerFactory.getLogger(getClass());

    /**-----------------基础服务方法 start------------------**/

    protected M getById(Serializable id){
        return (M)service.getById(id);
    }

    protected T saveOrUpdate(T t){
        // 这里默认处理新增和修改同一个方法，适用于 id 自生成场景，同时支持 新增、修改时间及操作者自动诸如注入
        if(service.saveOrUpdate4AutoGenId(t)){
            return t;
        }
        return null;
    }

    protected boolean deleteBatch(String strIds){
        Assert.isNull(strIds, "删除ids参数不合法");
        List<Serializable> ids = new ArrayList<Serializable>();
        for (String id : strIds.split(SPLIT_REGEX)) {
            if (StringUtils.isNotBlank(id)) {
                ids.add(id);
            }
        }
        Assert.isTrue(ids.isEmpty(), "删除ids参数不合法");
        return service.deleteBatch(ids);
        // return service.removeByIds(ids);
    }

    protected Page<M> queryPage(QueryModel<M> model){
        return service.queryPage(model);
    }

    protected List<M> queryList(M m){
        return service.queryList(m);
    }

    /**-----------------基础服务方法 end------------------**/

    /*@InitBinder
    protected void initBinder(WebDataBinder binder) {
        // String类型转换，将所有传递进来的String进行HTML编码，防止XSS攻击
        binder.registerCustomEditor(String.class, new PropertyEditorSupport() {
            @Override
            public void setAsText(String text) {
                setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim()));
            }
            @Override
            public String getAsText() {
                Object value = getValue();
                return value != null ? value.toString() : "";
            }
        });
        // Date 类型转换
        binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
            @Override
            public void setAsText(String text) {
                setValue(DateUtils.parseDate(text));
            }

        });
    }*/



}
